/**
 * @file h264_encode.hpp
 * @author jianming.song (jianming.song@calmcar.com)
 * @brief 此程序为使用ffmpeg封装h264编码，并将h264的数据写入内存
 * @version 0.1
 * @date 2021-10-26
 * 
 * @copyright Copyright (c) 2021
 * 
 */
#ifndef H264_ENCODE_HPP__
#define H264_ENCODE_HPP__
#ifdef __cplusplus
extern "C"
{
#include <libavcodec/avcodec.h>
#include <libavutil/time.h>
#include <libavutil/opt.h>
#include <libavutil/imgutils.h>
#include <libavformat/avformat.h>
#include <libavutil/samplefmt.h>
}
#endif
class H264Encoder
{
public:
    /**
     * @brief Construct a new H264Encoder object
     *  初始化编码器，内部会初始化所有ffmpeg需要的资源
     * 
     * @param image_width[in] 需要编码的图像的宽度
     * @param image_height[in] 需要编码的图像的高度
     * @param bitrate[in] 编码使用的巴驴
     * @param fps[in] 设备的帧率
     */
    H264Encoder(int image_width,int image_height,unsigned int bitrate, int fps);
    ~H264Encoder();
    /**
     * @brief 对输入的图像进行H264编码
     * 
     * @param image[in] 图像数据，YUV420编码，长度和宽度为构造函数传入 
     * @param h264_buffer[in，out] h264编码缓冲区 
     * @param buffer_size[in,out] 缓冲区长度，当编码成功后，输出编码的码流长度 
     * @return int 0 success, -1 error
     */
    int encode(uint8_t *image,uint8_t* h264_buffer,size_t*  buffer_size);
private:
    AVCodecContext* codec_ctx_;
    AVCodec*        codec_;
    AVFrame*        frame_;
    AVPacket*       pkt_;   
    int image_width_;
    int image_height_;
    size_t frame_bytes_;
    uint8_t* yuv_buffer_;

    size_t index_;
};
#endif